/*
 * Created on 06/09/2005
 */
package control;

import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import model.Instituicao;
import model.Permissao;
import model.UsuarioIF;
import dao.assinatura.InstituicaoDAO;
import dao.assinatura.PermissaoDAO;
import dao.assinatura.UsuarioDAO;
import dao.fabrica.FabricaDAO;


public class ControllerFilter implements Filter {

	  
    public void init(FilterConfig config) throws ServletException{}  
  
    public void destroy(){}  
  
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)   
        throws IOException, ServletException { 
    	
    	
    	HttpSession session = (((HttpServletRequest)request).getSession());
    	HttpServletRequest r = (HttpServletRequest)request;
   
    	if(session.getAttribute("usuario") == null ){
			//Se a condicao acima for verdadeira é pq ou eh a primeira vez que o usuário estah tentando logar ou é algum malandro 
    		//tentando acessar uma pagina sem estah logado
    		
    		//A forma que eu tenho de saber se eh um usuário normal tentando se logar eh pegando os parametros do formulário de login
    		String login = request.getParameter("login");
    		String senha = request.getParameter("senha");
    		UsuarioIF usuario = null;
    		
    		if(login != null && senha != null){
				try {
					
					UsuarioDAO usuarioDAO = FabricaDAO.createUsuario();
					
					usuario = usuarioDAO.getUsuario(login, senha);				
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
    			if(usuario != null){
    				
    				if(usuario.getAtivo())
    				{
	    				PermissaoDAO permissaoDAO = FabricaDAO.createPermissao();
	    				InstituicaoDAO instituicaoDAO = FabricaDAO.createInstituicao();
	    				try {
	    					ArrayList<Permissao> permissoes = permissaoDAO.getPermissoesUsuario(usuario);
							
				

							
							Instituicao instituicao = instituicaoDAO.getInstituicaoById(usuario.getInstituicao());
							session.setAttribute("usuario", usuario);
							session.setAttribute("permissoes", permissoes);
							session.setAttribute("instituicao", instituicao);
							
	    				} catch (SQLException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}   				
	    				chain.doFilter(request, response);
    				}else
    				{
    					
    					r.getRequestDispatcher("/paginas/erro/login_invalido.jsp").forward(request, response);
    				}
    				
    			}else
    			{
    				
    				r.getRequestDispatcher("/paginas/erro/login_invalido.jsp").forward(request, response);
    			}
    		}else{
    			//Se entrar aqui, eh pq algum malandro está tentando acessar alugma pagina sem passar pela tela de login.
    			
    			r.getRequestDispatcher("/paginas/erro/404.jsp").forward(request, response);
    		}    		    		
    	}
    	
    	else{
    		
    		//Pego o usuario da sessao.
    		//UsuarioIF usuario = (UsuarioIF) session.getAttribute("usuario");
    		chain.doFilter(request, response);
		} 	
    } 	
}